import { json, query, action, useParams, createAsync, useSubmission } from "@solidjs/router" import { createEffect, createSignal, For, Show } from "solid-js" import { IconCopy, IconCheck } from "~/component/icon" import { Key } from "@opencode-ai/console-core/key.js" import { withActor } from "~/context/auth.withActor" import { createStore } from "solid-js/store" import { formatDateUTC, formatDateForTable } from "../../common" import styles from "./key-section.module.css" import { Actor } from "@opencode-ai/console-core/actor.js" import { useI18n } from "~/context/i18n" import { formError, localizeError } from "~/lib/form-error" const removeKey = action(async (form: FormData) => { "use server" const id = form.get("id") as string | null if (!id) return { error: formError.idRequired } const workspaceID = form.get("workspaceID") as string | null if (!workspaceID) return { error: formError.workspaceRequired } return json(await withActor(() => Key.remove({ id }), workspaceID), { revalidate: listKeys.key }) }, "key.remove") const createKey = action(async (form: FormData) => { "use server" const name = (form.get("name") as string | null)?.trim() if (!name) return { error: formError.nameRequired } const workspaceID = form.get("workspaceID") as string | null if (!workspaceID) return { error: formError.workspaceRequired } return json( await withActor( () => Key.create({ userID: Actor.assert("user").properties.userID, name, }) .then((data) => ({ error: undefined, data })) .catch((e) => ({ error: e.message as string })), workspaceID, ), { revalidate: listKeys.key }, ) }, "key.create") const listKeys = query(async (workspaceID: string) => { "use server" return withActor(() => Key.list(), workspaceID) }, "key.list") export function KeySection() { const params = useParams() const i18n = useI18n() const keys = createAsync(() => listKeys(params.id!)) const submission = useSubmission(createKey) const [store, setStore] = createStore({ show: false }) let input: HTMLInputElement createEffect(() => { if (!submission.pending && submission.result && !submission.result.error) { setStore("show", false) } }) function show() { while (true) { submission.clear() if (!submission.result) break } setStore("show", true) setTimeout(() => input?.focus(), 0) } function hide() { setStore("show", false) } return (

{i18n.t("workspace.keys.title")}

{i18n.t("workspace.keys.subtitle")}

(input = r)} data-component="input" name="name" type="text" placeholder={i18n.t("workspace.keys.placeholder")} /> {(err) =>
{localizeError(i18n.t, err())}
}

{i18n.t("workspace.keys.empty")}

} > {(key) => { const [copied, setCopied] = createSignal(false) // const submission = useSubmission(removeKey, ([fd]) => fd.get("id")?.toString() === key.id) return ( ) }}
{i18n.t("workspace.keys.table.name")} {i18n.t("workspace.keys.table.key")} {i18n.t("workspace.keys.table.createdBy")} {i18n.t("workspace.keys.table.lastUsed")}
{key.name} {key.keyDisplay}}> {key.email} {key.timeUsed ? formatDateForTable(key.timeUsed) : "-"}
) }